#include<stdio.h>
#include<string.h>
#include<math.h>
int main()
{
	int i,j,num,resum;
start:
	printf("请输入棋盘大小：\n");
	scanf("%d",&num);
	char a[100][100];
	char name1[10],name2[10];
	int restart=0;

	printf("请输入先手、后手的名字：\n");
	scanf("%s %s",name1,name2);
	printf("请输入每方可悔棋的次数：\n");
	scanf("%d",&resum);

	
	//打印初始棋盘
	printf("00");  //坐标辅助
	for(i=0;i<num;i++)
	{
		printf(" %.2d",i+1);
	}
	printf("\n");
	for(i=0;i<num;i++)
	{
		printf("%.2d",i+1);//坐标辅助
		for(j=0;j<num;j++)
		{
			a[i][j]='+';
			printf(" %c ",a[i][j]);
		}
		printf("\n");
	}
	
	//下棋
	printf("先手符号为‘X’，后手符号为‘O’，棋子横纵坐标范围为1-%d，输入坐标为 (0 0) 时可以悔棋\n",num);
	int n=1;
	int p,q,p0,q0;
	int r=0;
	int regret1=0;
	int regret2=0;
	while(r!=1)
	{
		if(n%2==1)
		{
			printf("第%d步，先手%s下，符号为‘X’，输入棋子坐标，格式为: x y\n",n,name1);
		}
		else if(n%2==0)
		{
			printf("第%d步，后手%s下，符号为‘O’，输入棋子坐标，格式为: x y\n",n,name2);
		}
		scanf("%d %d", &p0,&q0);
		
		//悔棋设置
		if(p0==0&&q0==0)
		{
			if(n==1)
				printf("不在棋盘范围内，请重新输入\n");
			else if(regret1<resum&&n%2==0)
			{
				n--;
				a[p][q]='+';
				regret1++;
				printf("先手%s悔棋%d步\n",name1,regret1);
			}
			else if(regret2<resum&&n%2==1)
			{
				n--;
				a[p][q]='+';
				regret2++;
				printf("后手%s悔棋%d步\n",name2,regret2);
			}
			else if(regret1>=resum)	
			{
				printf("先手%s已用完悔棋步数！\n",name1);
			}	
			else if(regret2>=resum)	
			{
				printf("后手%s已用完悔棋步数！\n",name2);
			}	
			continue;
		}
		else
		{
			p=p0-1;
			q=q0-1;
		}
		
			
		if(p<0||p>=num||q<0||q>=num)//检验落子范围
		{
			printf("不在棋盘范围内，请重新输入\n");
			continue;
		}
		if(a[p][q]=='+'&&n%2==1)
			a[p][q]='X';
		else if(a[p][q]=='+'&&n%2==0)
			a[p][q]='O';
		else if(a[p][q]=='X'||a[p][q]=='O')
		{
			printf("重复落子，请重新输入\n");
			continue;
		}
				
		//打印棋盘
		printf("00");  //坐标辅助
		for(i=0;i<num;i++)
		{
			printf(" %.2d",i+1);
		}
		printf("\n");	
		for(i=0;i<num;i++)
		{	
			printf("%.2d",i+1);//坐标辅助	
			for(j=0;j<num;j++)
			{
				printf(" %c ",a[i][j]);
			}	
			printf("\n");
		}	
			
		
		//判定胜负
		int b=0,c=0,d=0,e=0;
		//横排成五子
		for(i=0;i<5;i++)
		{
			if(p+i<num&&a[p+i][q]==a[p][q])
				b++;
			else break;
		}
		for(i=1;i<5;i++)
		{		
			if(p-i>=0&&a[p-i][q]==a[p][q])
				b++;
			else break;
		}
		if(b>=5) r=1;
		
		//竖排成五子
		for(i=0;i<5;i++)
		{
			if(q+i<num&&a[p][q+i]==a[p][q])
				c++;
			else break;
		}
		for(i=1;i<5;i++)
		{
			if(q-i>0&&a[p][q-i]==a[p][q])
				c++;
			else break;
		}
		if(c>=5) r=1;
		
		//撇方向成五子
		for(i=0;i<5;i++)
		{
			if(p+i<num&&q+i<num&&a[p+i][q+i]==a[p][q])
				d++;
			else break;
		}
		for(i=1;i<5;i++)
		{
			if(p-i>0&&q-i>0&&a[p-i][q-i]==a[p][q])
				d++;
			else break;
		}
		if(d>=5) r=1;
		
		//捺方向成五子
		for(i=0;i<5;i++)
		{
			if(p+i<num&&q-i>0&&a[p+i][q-i]==a[p][q])
				e++;
			else break;
		}
		for(i=1;i<5;i++)
		{
			if(p-i>0&&q+i<num&&a[p-i][q+i]==a[p][q])
				e++;
			else break;
		}
		if(e>=5) r=1;
		
		n++;
		
		//和局判定	
		if(r==0&&n==num*num+1)
		{
			printf("此为和局\n");
			r=1;
		}		
	}
	
	if(n<num*num+1&&n%2==0)
		printf("先手%s获胜\n",name1);
	else if(n<num*num+1&&n%2==1)
		printf("后手%s获胜\n",name2);
	
	
	//重启一局
	printf("是否再来一局，是请输入“1”，否请输入“0”\n");
	scanf("%d",&restart);
	if(restart==0)
		printf("游戏结束");
	if(restart==1)
		goto start;
		
}